package com.xbongbong.saas.model;

import com.alibaba.fastjson.JSONObject;
import com.xbongbong.paas.toolbox.exception.XbbException;
import com.xbongbong.paas.toolbox.wrap.IModel;
import com.xbongbong.saas.domain.entity.BusinessProductEntity;
import com.xbongbong.saas.domain.entity.InstockProductEntity;
import com.xbongbong.saas.domain.entity.OutstockProductEntity;
import com.xbongbong.saas.domain.entity.ext.InstockEntityExt;
import com.xbongbong.saas.domain.entity.ext.ProductEntityExt;

import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * 入库单产品
 * @author Jian.Wang
 * @date 2019/2/21 20:38
 * @since v1.0
 * @version v1.0
 */
public interface InstockProductModel extends IModel<InstockProductEntity> {
    /**
     * 入库单产品数据保存
     * @param instockProductEntity 供应商实体
     * @author Jian.Wang
     * @date 2019/1/23 20:27
     * @since v1.0
     * @return Integer
     */
    Integer save(InstockProductEntity instockProductEntity) throws XbbException;
    /**
     * 入库单产品数据删除
     * @param key 要删除的Id
     * @param corpid 公司ID
     * @author Jian.Wang
     * @date 2019/1/23 20:27
     * @since v1.0
     * @return Integer
     */
    Integer deleteByKey(Long key, String corpid);
    /**
     * 根据入库单Id删除所有入库单产品
     * @param intoWarehouseId 入库ID
     * @param corpid 公司ID
     * @author Jian.Wang
     * @date 2019/1/23 20:27
     * @since v1.0
     * @return Integer
     */
    Integer deleteByInstockId(Long intoWarehouseId, String corpid);
    /**
     * 根据入库单Id删除所有入库单产品--批量
     * @param corpid 公司ID
     * @param instockIdIn 入库单Id集合
     * @author Jian.Wang
     * @date 2019/1/23 20:27
     * @since v1.0
     * @return Integer
     */
    Integer deleteByInstockIdIn(String corpid, List<Long> instockIdIn);
    /**
     * 根据入库单Id删除所有入库单产品--批量
     * @param key 数据ID
     * @param corpid 公司ID
     * @author Jian.Wang
     * @date 2019/1/23 20:27
     * @since v1.0
     * @return InstockProductEntity
     */
    InstockProductEntity getByKey(Long key, String corpid);
    /**
     * 根据入库单idIn获取对应出库单产品
     *
     * @param corpid 公司id
     * @param instockIdIn 入库单idIn
     * @return List<InstockProductEntity> 数据集合
     * @author lcx
     * @date 2019/2/21 15:18
     */
    List<InstockProductEntity> getProductsByInstockIdIn(String corpid, List<Long> instockIdIn);

    /**
     * 根据入库单idIn获取对应出库单产品
     *
     * @param corpid 公司id
     * @param instockIdIn 入库单idIn
     * @return List<InstockProductEntity> 数据集合
     * @author lcx
     * @date 2019/2/21 15:18
     */
    List<InstockProductEntity> getProductsByInstockIdAndType(String corpid, List<Long> instockIdIn, Integer type);
    /**
     * 根据入库单id获取对应出库单产品
     *
     * @param corpid 公司id
     * @param instockId 入库单id
     * @param delIn del
     * @return List<InstockProductEntity> 数据集合
     * @author lcx
     * @date 2019/2/21 15:18
     */
    List<InstockProductEntity> getProductsByInstockIdIn(String corpid, Long instockId, List<Integer> delIn);

    /**
     * 更新仓库产品数据  包括库存和成本
     *
     * @author GuoJun.HU
     * 创建时间： 2017/3/29 14:36
     */
    String updateWarehouseProduct(String corpid, Long warehouseId, List<InstockProductEntity> instockProducts);

    /**
     * 入库单/出库单/盘点单/调拨单的库存产品模板字段设置
     *
     * @param excelMap      Excel表的数据
     * @param explainMap    模板解释
     * @param entity        业务主体数据【ProductStockInfo/ProductBaseInfo】
     * @param fieldEntity   业务自定义数据
     * @param corpid        公司id
     * @author GuoJun.HU
     * @since 3.27
     * 创建时间 2018/8/30 20:43
     */
     // boolean setStockProductValue4Instock(Map<String,String> excelMap, Map<String, RedundantFieldExplainEntity> explainMap, ImportEntity entity, RedundantFieldEntity fieldEntity, String corpid);

    /**
     * 入库单导入时导入关联产品
     *
     * @param instock 入库单
     * @author GuoJun.HU
     * @since 3.27
     * 创建时间 2018/8/9 15:38
     */
     void setInstockProduct(InstockEntityExt instock);

     InstockProductEntity setLatestParam(InstockProductEntity instockProduct, List<ProductEntityExt> products) ;

    /**
     * 保存产品扩展字段
     *
     * @param productObj     产品json对象
     * @param nowTemplateId  产品库存模板id
     * @param instockProduct 入库单产品
     * @author 周智
     * 创建时间： 2017-12-7 11:28
     */
    void saveRedundantField(JSONObject productObj, Long nowTemplateId, InstockProductEntity instockProduct);

    /**
     * 获取入库单关联产品的库存产品信息
     *
     * @param corpid           公司id
     * @param relativeProducts 入库单产品
     * @return 入库单产品库存信息
     * @author GuoJun.HU
     * 创建时间：2017/12/5 9:22
     */
    Map<Long, List<InstockProductEntity>> setInstockProductExtraInfo(String corpid, List<InstockProductEntity> relativeProducts);

    /**
     * @param corpid       公司id
     * @param nameOrNoLike 产品名称或编号
     * @description: 通过产品名称或编号查询对应的入库单id
     * @author: lcx
     * @date: 2018/7/19 10:06
     * @modify:
     * @version: 3.26
     * @return:
     */
    List<Long> findInstockIdsByRelaProNameOrNo(String corpid, String nameOrNoLike) ;

    /**
     * 对于可以分批入库的单据，某些场景需要将多次入库的同一个产数量合并
     *
     * @param
     * @author GuoJun.HU
     * @since 3.27
     * @return
     * 创建时间 2018/9/6 20:07
     */
    Collection<InstockProductEntity> mergeInstockProduct(List<InstockProductEntity> instockProductList);
    /**
     * 入库产品实体List
     * @param param 包含产品IdList
     * @return 入库产品实体，包含产品Id和成品入库总成本
     * @author 徐俊杰
     * @since 汪汪十一月
     * 创建时间 2018/12/20 17:20
     * 修改时间
     */
     List<InstockProductEntity> getCostSum(Map<String ,Object>  param);
     
     /**
      * 获取产品总销量
      * @param param
      * @return java.lang.Double 
      * @author zcp
      * @date 2019/4/16 10:22
      * @since v1.0
      * @version v1.0
      */
     Double getProductNumSum(Map<String ,Object>  param);

    /**
     * 批量删除入库单产品
     * @param delInstockProductIdList
     * @param corpid
     * @param del
     */
    Integer deleteBatchById(Collection<Long> delInstockProductIdList, String corpid, Integer del);

    /**
     * 批量插入
     * @param instockProductEntityList
     */
    void insertBatch(List<InstockProductEntity> instockProductEntityList);

    List<InstockProductEntity> sumProductNumGroupProAndWarehouse(List<Long> dataIdList, String corpid);

    List<BusinessProductEntity> findProductNum(Map<String,Object> param);

    Integer findProductNumCount(Map<String,Object> param);

    /**
    * @Description:  通过仓库id列表构建仓库id
    * @Param: [corpid, warehouseIdIn, del]
    * @return: java.util.Map<java.lang.Long,com.xbongbong.saas.domain.entity.InstockProductEntity>
    * @Author: cyy
    * @Date: 2019/11/11
    */
    Map<Long,InstockProductEntity> getInstockProductMapByIdIn(String corpid, List<Long> warehouseIdIn, Integer del);

    Integer updateBatch(List<InstockProductEntity> updateList, String corpid) throws XbbException;

    Long isProductSubAttrExist(String attr, String corpid, Long formId, Integer isArray);

    /**
     * 入库单上游单据的入库产品
     * @param corpid
     * @param type
     * @param refId
     * @return
     */
    List<InstockProductEntity> getUpStreamProduct(String corpid, Integer type, Long refId) throws XbbException;

    InstockProductEntity getProductsByInstockIdAndRefProductId(Long instockId, Long refProductId, String corpid);

    /**
     * 子表单数字字段汇总
     * @param corpid 公司id
     * @param field 需要汇总的字段
     * @param refId 单据id
     * @param productIdIn 单据在该产品关联的产品id 如生产单有物料产品和成品产品 refId为生产单id productIdIn为物料产品的id
     * @return
     */
    Double summaryByAttr(String field,String corpid,  Long refId, List<Long> productIdIn);

    Double summaryByAttrFromOutSide(String field, String corpid, Long refId, List<Long> productIdIn);

    /**
     * Description: 一致性同步
     * @param corpid
     * @param productId
     * @param productName
     * @param specification
     * @param productNo
     * @return java.lang.Integer
     * @author 魏荣杰
     * @date 2019/12/4 3:58 下午
     * @since v4.7.1
     */
    Integer dataConsistencyUpdate(String corpid, Long productId, String productName, String specification, String productNo);

    Long countProductSub(String attr, String corpid, Long formId, Integer isArray);

    List<InstockProductEntity> getProductWithSubData(String attr, String corpid, Long formId, Integer isArray, Long idGte, Integer limit);

    /**
     * 批量更新
     * @param list
     * @param corpid
     * @return
     * @throws XbbException
     */
    Integer updateMulti(List<InstockProductEntity> list, String corpid) throws XbbException;

    /**
     * 根据入库单idIn获取对应出库单产品
     *
     * @param corpid 公司id
     * @param stockAndRefund 入库单idIn
     * @return Map<Long , Long> stockAndRefund 数据集合
     * @author lcx
     * @date 2019/2/21 15:18
     */
    List<InstockProductEntity> findRefundkProductandContract(Map<Long, Long> stockAndRefund, String corpid);

    void updateInstockProductById(List<InstockProductEntity> instockProductEntityList, String corpid);

    List<InstockProductEntity> getInstockProductById(List<Long> instockProductId, String corpid );

    InstockProductEntity getInstockProductSum(Map<String, Object> map);

    /**
     * 根据采购合同id和产品id获取采购入库单信息
     * @date 2022/5/20 15:18
     */
    List<InstockProductEntity> getInstockProductByRefId(Map<String, Object> param);

    Set<Long> getWarehouseIdUnion(Set<Long> warehouseIdList, String corpid);
}
